using System;
using System.Collections.Generic;
using System.Text;
using System.Data;


using RRHH.Competencias.Entities;
using RRHH.Competencias.DataAccessLayer.Generic;

namespace RRHH.Competencias.DataAccessLayer.SqlServerProvider
{
    public class DALSqlServerCapacidad:IDALCapacidad
    {
        

        public DALSqlServerCapacidad()
        {
        
        }

        #region Miembros de IDALABM<Capacidad>

        public void Completar(Capacidad itemCompletar)
        {
            try
            {
                List<Capacidad> lstCapacidades = Buscar(itemCompletar);

                if (lstCapacidades.Count > 0)
                {
                    itemCompletar.Id = lstCapacidades[0].Id;
                    itemCompletar.Nombre = lstCapacidades[0].Nombre;
                    itemCompletar.Descripcion = lstCapacidades[0].Descripcion;

                    itemCompletar.Tipo = new TipoCapacidad(lstCapacidades[0].Tipo.Id, string.Empty, string.Empty);
                }
                else
                    itemCompletar = null;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        public void Guardar(Capacidad item)
        {
            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Capacidad_insertar");
            stored.AgregarParametro("@nombre", item.Nombre);
            stored.AgregarParametro("@descripcion", item.Descripcion);
            if (item.Tipo != null) stored.AgregarParametro("@tipoCapacidad", item.Tipo.Id);
            else stored.AgregarParametro("@tipoCapacidad", null, typeof(long));
            item.Id = Convert.ToInt64(stored.ExecuteScalar());
        }

        public void GuardarOActualizar(Capacidad item)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        public void Actualizar(Capacidad item)
        {
            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Capacidad_actualizar");
            stored.AgregarParametro("@capacidad_id", item.Id);
            stored.AgregarParametro("@nombre", item.Nombre);
            stored.AgregarParametro("@descripcion", item.Descripcion);
            stored.AgregarParametro("@tipoCapacidad", item.Tipo.Id);
            stored.ExecuteNonQuery();
        }

        public void Borrar(Capacidad item)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        public void Activar(Capacidad item)
        {
            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Capacidad_activar");
            stored.AgregarParametro("@capacidad_id", item.Id);
            stored.ExecuteNonQuery(); 
        }

        public void Desactivar(Capacidad item)
        {
            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Capacidad_desactivar");
            stored.AgregarParametro("@capacidad_id", item.Id);
            stored.ExecuteNonQuery(); 
        }
        
        public List<Capacidad> BuscarTodos()
        {
            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Capacidad_buscarTodos");
            return CargarLista(stored.ExecuteDataTable());
        }

        public List<Capacidad> Buscar(Capacidad item)
        {
            try
            {
                DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Capacidad_buscar");
                if (item.Id > 0) stored.AgregarParametro("@capacidad_id", item.Id, typeof(long));
                else stored.AgregarParametro("@capacidad_id", null, typeof(long));
                stored.AgregarParametro("@nombre", item.Nombre, typeof(string));
                stored.AgregarParametro("@descripcion", item.Descripcion, typeof(string));
                if (item.Tipo != null) stored.AgregarParametro("@tipoCapacidad", item.Tipo.Id, typeof(long));
                else stored.AgregarParametro("@tipoCapacidad", null, typeof(long));

                return CargarLista(stored.ExecuteDataTable());
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<Capacidad> Buscar(long? capacidad_id, string nombre, string descripcion, TipoCapacidad tipo, bool soloActivos)
        {
            try
            {
                DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Capacidad_buscar");
                stored.AgregarParametro("@capacidad_id", capacidad_id, typeof(long));
                stored.AgregarParametro("@nombre", nombre, typeof(string));
                stored.AgregarParametro("@descripcion", descripcion, typeof(string));
                if (tipo != null) stored.AgregarParametro("@tipoCapacidad", tipo.Id, typeof(long));
                else stored.AgregarParametro("@tipoCapacidad", null, typeof(long));
                stored.AgregarParametro("@soloActivos", soloActivos, typeof(bool));

                return CargarLista(stored.ExecuteDataTable());
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private List<Capacidad> CargarLista(DataTable dt)
        {
            
            List<Capacidad> lstCapacidades = new List<Capacidad>();
            foreach (DataRow dRow in dt.Rows)
            {
                Capacidad capacidad = new Capacidad();
                capacidad.Id = Convert.ToInt64(dRow["capacidad_id"]);
                capacidad.Nombre = dRow["nombre"].ToString();
                capacidad.Descripcion = dRow["descripcion"].ToString();
                capacidad.Tipo = new TipoCapacidad();
                capacidad.Tipo.Id = Convert.ToInt64(dRow["TipoCapacidad"]);
                if(!string.IsNullOrEmpty(dRow["fechaBaja"].ToString()))
                    capacidad.FechaBaja = DateTime.Parse(dRow["fechaBaja"].ToString());
                lstCapacidades.Add(capacidad);
            }
            return lstCapacidades;
        }
        #endregion  

    }
}
